﻿using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace MultipleChoice_ExamGenerator.VariousUtils
{
    class AuthorValidator
    {
        /// <summary>
        /// Με αυτή την μέθοδο ελέγχουμε αν ο χρήστης έχει επιλέξει
        /// τουλάχιστον μια επιλογή στο genderComboBox
        /// </summary>
        /// <param name="genderComboBox">Το ComboBox που καθορίζει το φύλο</param>
        /// <param name="errorProvider">O ErrorProvider</param>
        /// <returns></returns>
        public bool ValidateGender(ComboBox genderComboBox, ErrorProvider errorProvider)
        {
            if (genderComboBox.SelectedIndex != -1)
            {
                errorProvider.SetError(genderComboBox, "");
                return true;
            }
            errorProvider.SetError(genderComboBox, "Please select your gender!");
            return false;
        }

        /// <summary>
        /// Με αυτή την μέθοδο ελέγχουμε αν ο χρήστης έχει επιλέξει
        /// ερώτηση ασφαλείας
        /// </summary>
        /// <param name="sQuestionComboBox">To ComboBox με τις ερωτήσεις ασφαλείας</param>
        /// <param name="errorProvider">O ErrorProvider</param>
        /// <returns></returns>
        public bool ValidateSecurityQuestion(ComboBox sQuestionComboBox, ErrorProvider errorProvider)
        {
            if (sQuestionComboBox.SelectedIndex <= -1)
            {
                errorProvider.SetError(sQuestionComboBox, "Please select one security question!");
                return false;
            }
            errorProvider.SetError(sQuestionComboBox, "");
            return true;
        }

        /// <summary>
        /// Αυτή η μέθοδος ελέγχει αν ένα TextBox είναι άδειο
        /// </summary>
        /// <param name="textBox">το TextBox που θα ελέγξουμε</param>
        /// <param name="errorProvider">O ErrorProvider</param>
        /// <returns>true/false</returns>
        public bool ValidateRequired(TextBox textBox, ErrorProvider errorProvider)
        {
            if (string.IsNullOrEmpty((textBox.Text).Trim()))
            {
                errorProvider.SetError(textBox, "Required");
                return false;
            }
            errorProvider.SetError(textBox, "");
            return true;
        }

        /// <summary>
        /// Αυτή η μέθοδος κάνει το Validate του Username TextBox.
        /// </summary>
        /// <param name="usernameTb">Το TextBox που περιέχει το username</param>
        /// <param name="errorProvider">O ErrorProvider</param>
        /// <returns>true/false</returns>
        public bool ValidateUsername(TextBox usernameTb, ErrorProvider errorProvider)
        {
            var username = usernameTb.Text.Trim();
            if (string.IsNullOrEmpty(username))
            {
                errorProvider.SetError(usernameTb, "Required");
                return false;
            }
            if (usernameTb.Text.Length < 4)
            {
                errorProvider.SetError(usernameTb, "Username must be 4 or more characters!");
                return false;
            }
            if (usernameTb.Text.Length > 16)
            {
                errorProvider.SetError(usernameTb, "Username must be 16 or less characters!");
                return false;
            }
            if (!DB.DbQueries.IsUsernameValid(username))
            {
                errorProvider.SetError(usernameTb, "Username already taken!");
                return false;
            }
            errorProvider.SetError(usernameTb, "");
            return true;
        }

        /// <summary>
        /// Αυτή η μέθοδος ελέγχει αν ο χρήστης έχει εισάγει τον κωδικό του
        /// στα πεδία passwordTB1 και passwordTB2, αν είναι ίδιος και αν είναι
        /// τουλάχιστον 6 χαρακτήρες.
        /// <para name="passwordTB1">Το πρώτο TextBox με τον κωδικό του χρήστη</para>
        /// <para name="passwordTB2">Το δεύτερο TextBox με τον κωδικό του χρήστη</para>
        /// <param name="errorProvider">O ErrorProvider</param>
        /// </summary>
        public bool ValidatePassword(TextBox passwordTb1, TextBox passwordTb2, ErrorProvider errorProvider)
        {
            var pass1 = passwordTb1.Text.Trim();
            var pass2 = passwordTb2.Text.Trim();
            if (string.IsNullOrEmpty(pass1) || string.IsNullOrEmpty(pass2) || !pass1.Equals(pass2))
            {
                errorProvider.SetError(passwordTb1, "Passwords do not match!");
                errorProvider.SetError(passwordTb2, "Passwords do not match!");
                return false;
            }
            if (pass1.Length < 6 && pass2.Length < 6)
            {
                errorProvider.SetError(passwordTb1, "Password must be at least 6 characters!");
                errorProvider.SetError(passwordTb2, "Password must be at least 6 characters!");
                return false;
            }
            errorProvider.SetError(passwordTb1, "");
            errorProvider.SetError(passwordTb2, "");
            return true;
        }

        /// <summary>
        /// Αυτή η μέθοδος ελέγχει αν ο χρήστης έχει εισάγει τον κωδικό του
        /// στo πεδία passwordTb και αν είναι τουλάχιστον 6 χαρακτήρες
        /// τουλάχιστον 6 χαρακτήρες.
        /// <para name="passwordTB1">Το TextBox με τον κωδικό του χρήστη</para>
        /// <param name="errorProvider">O ErrorProvider</param>
        /// </summary>
        public bool ValidatePassword(TextBox passwordTb, ErrorProvider errorProvider)
        {
            var pass1 = passwordTb.Text.Trim();
            if (string.IsNullOrEmpty(pass1))
            {
                errorProvider.SetError(passwordTb, "Password field cannot be empty!");
                return false;
            }
            if (pass1.Length < 6)
            {
                errorProvider.SetError(passwordTb, "Password must be at least 6 characters!");
                return false;
            }
            errorProvider.SetError(passwordTb, "");
            return true;
        }

        /// <summary>
        /// Με αυτή την μέθοδο γίνεται το Validation του email.
        /// </summary>
        /// <param name="emailTb">Το TextBox που περιέχει το email</param>
        /// <param name="errorProvider">O ErrorProvider</param>
        /// <returns></returns>
        public bool ValidateEmail(TextBox emailTb, ErrorProvider errorProvider)
        {
            if (!IsEmailValid(emailTb.Text.Trim()))
            {
                errorProvider.SetError(emailTb, "Email address is not valid!");
                return false;
            }
            errorProvider.SetError(emailTb, "");
            return true;
        }

        /// <summary>
        /// Αυτή η μέθοδος ελέγχει ένα string για το αν είναι valid
        /// email address.
        /// </summary>
        /// <param name="email">Ενα string</param>
        /// <returns>true/false</returns>
        public bool IsEmailValid(string email)
        {
            const string regexp = "[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?";
            return Regex.Match(email, regexp).Success;
        }

    }
}
